package logica_de_negocio;

import java.util.HashSet;

import logica_de_datos.GestorBD;
import comun.ValoracionCapitulo;

public class gestorValoracionCapitulo {

	private HashSet<ValoracionCapitulo> gvc;
	final GestorBD objConversor = GestorBD.getInstance();

	public gestorValoracionCapitulo() {
		gvc = new HashSet<ValoracionCapitulo>();
	}

	/**
	 * Carga en el HashSet todas las valoraciones realizadas por los usuarios
	 * sobre los capitulo.
	 */
	public void cargarDatos() {

		try {
			objConversor.connect();
			gvc = objConversor.listarValoracionCapitulo();
			objConversor.disconnect();
		} catch (ClassNotFoundException e) {
		}
	}

	public void addValoracionCapitulo(ValoracionCapitulo valorCap)
			throws excepAnadirDupli, FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {
		cargarDatos();

		if (gvc.contains(valorCap)) {
			excepAnadirDupli dupli = new excepAnadirDupli();
			dupli.setDes("El capitulo con id " + valorCap.getId_c()
					+ "  ya esta valorado");
			throw dupli;
		} else {
			comprovarvalorCap(valorCap);
			
				objConversor.connect();
				objConversor.addValoracionCapitulo(valorCap);
				objConversor.disconnect();

		}
	}

	private void comprovarvalorCap(ValoracionCapitulo valorCap)
			throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {

		/**
		 * Comprueba que tanto en id del usuario como el del capitulo esten en
		 * la base de datos
		 */

		boolean estaC = false;
		gestorCapitulo gc = new gestorCapitulo();
		if (gc.isId(valorCap.getId_c())) {
			estaC = true;
		}
		boolean estaU = false;
		gestorUsuario gu = new gestorUsuario();
		if (gu.isId(valorCap.getId_u())) {
			estaU = true;
		}
		if ((estaC == false) || (estaU == false)) {
			FaltanDatosEnLaBaseDeDatos ex = new FaltanDatosEnLaBaseDeDatos();
			if (estaC == false) {
				ex.setFalta("Falta el id del Capitulo ");
			}
			if ((estaU == false) && (estaC == false)) {
				ex.setFalta(ex.getFalta() + " y ");
			}
			if (estaU == false) {
				if (ex.getFalta() == null) {
					ex.setFalta("Falta el id del usuario ");
				} else {
					ex.setFalta(ex.getFalta() + "falta el id del usuario ");
				}

			}
			ex.setFalta(ex.getFalta() + "en la Base De datos");
			throw ex;
		}

	}

	/**
	 * Mofificar la valoracion si existe sino se devuelve un false. Si se
	 * modifica correctamente devuelve un true si no se llega a modificar un
	 * false.
	 * 
	 * @param valorCap
	 *            ->ValoracionCapitulo (Obj) que se desea modificar
	 * @return True en el caso que se modifique correctamente sino false.
	 * @throws ClassNotFoundException Error que se lanza cuando no existe la base de datos.
	 */
	public boolean modificarValoracionCapitulo(ValoracionCapitulo valorCap) throws ClassNotFoundException {

		cargarDatos();
		boolean dev = false;
		if (gvc.contains(valorCap)) {
				objConversor.connect();
				objConversor.modifyValoracionCapitulo(valorCap);
				dev = true;
				objConversor.disconnect();
			
		}
		return dev;
	}

	/**
	 * Borra todo las valoraciones realizadas por un usuario. Necesitando
	 * unicamente su id.
	 * 
	 * @param id_u
	 *            ->Id del usuario del que se quiere eliminar las valoraciones
	 * @return boolean que indica si se borra true, o no false, las
	 *         valoraciones.
	 */
	public boolean deleteAllValoracionCapituloFromId_U(int id_u) {

		boolean dev = false;
		if (isId_u(id_u)) {
			try {
				objConversor.connect();
				objConversor.deleteValoracionCapituloAllFromId_u(id_u);
				dev = true;
				objConversor.disconnect();
			} catch (ClassNotFoundException e) {
			}
		}
		return dev;
	}

	/**
	 * Borra todo las valoraciones realizadas sobre un capitulo. Necesitando
	 * unicamente el id capitulo.
	 * 
	 * @param id_c
	 *            ->Id del capitulo del que se quiere eliminar las valoraciones
	 * @return boolean que indica si se borra true, o no false, las
	 *         valoraciones.
	 * @throws ClassNotFoundException Error que se lanza cuando no existe la base de datos.
	 */
	public boolean deleteAllValoracionCapituloFromId_C(int id_c) throws ClassNotFoundException {

		boolean dev = false;
		if (isId_c(id_c)) {
			
				objConversor.connect();
				objConversor.deleteValoracionCapituloAllFromId_c(id_c);
				dev = true;
				objConversor.disconnect();
			
		}
		return dev;
	}

	public boolean isId_c(int id_c) {
		boolean dev = false;

		cargarDatos();

		for (ValoracionCapitulo vc : gvc) {
			if (vc.getId_c() == id_c) {
				dev = true;
			}
		}
		return dev;
	}

	public boolean isId_u(int id_u) {
		boolean dev = false;

		cargarDatos();

		for (ValoracionCapitulo vc : gvc) {
			if (vc.getId_u() == id_u) {
				dev = true;
			}
		}
		return dev;
	}

	/**
	 * Obtener una valoacion de un capitulo concreto por parte de un usuario.
	 * 
	 * @param id_u
	 *            Id del usuario que se realizo la valoracion.
	 * @param id_c
	 *            Id del capitulo que se quiere obtener la valoracion.
	 * @return ValoracionCapitulo deseada.
	 * @throws FaltanDatosEnLaBaseDeDatos
	 * @throws ClassNotFoundException Error que se lanza cuando no existe la base de datos.
	 */
	public ValoracionCapitulo getValoracionCapitulo(int id_u, int id_c)
			throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {
		ValoracionCapitulo vc = null;
		
			objConversor.connect();
			vc = objConversor.getValoracionCapitulo(id_u, id_c);
			objConversor.disconnect();
			if (vc == null) {
				FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
				f.setFalta("No existe valoracion para esa pelicula");
				throw f;
			}
		
		return vc;
	}

	public boolean isVal(ValoracionCapitulo vc) {
		cargarDatos();
		boolean dev = false;
		dev = gvc.contains(vc);
		return dev;
	}

	public boolean estaVacia() {

		boolean dev = false;

		cargarDatos();

		dev = gvc.isEmpty();

		return dev;
	}

	/**
	 * Devuelve los id de los capitulos que ha sido valordos por un usuario en
	 * concreto.
	 * 
	 * @param id_u
	 *            Id del usuario del que se quiere saber que ha valorado.
	 * @return HashSet<Integer> con los id_c id de los capitulos,
	 */
	public HashSet<Integer> getId_cFromValoracionesCapitulo(int id_u) {

		HashSet<Integer> id_val = new HashSet<Integer>();
		try {
			objConversor.connect();
			id_val = objConversor.getId_cValoracionCapituloFromId_u(id_u);
			objConversor.disconnect();

		} catch (ClassNotFoundException e) {
		}
		return id_val;
	}

	/**
	 * Obtener las valoraciones realizadas a un capitulo en concreto dando su
	 * id.
	 * 
	 * @param id_c
	 *            Id del capitulo que se desea saber sus valoraciones.
	 * @return HashSet que contiene todas las valoracionesCapitulo (Obj)
	 *         realizadas a un capitulo.
	 * @throws FaltanDatosEnLaBaseDeDatos
	 *             Excepecion lanzada cuando un capitulo no ha sido valorado.
	 */
	public HashSet<ValoracionCapitulo> getValoradasCapitulo(int id_c)
			throws FaltanDatosEnLaBaseDeDatos {
		boolean Valorada = isId_c(id_c);

		HashSet<ValoracionCapitulo> idPelis = new HashSet<ValoracionCapitulo>();

		if (Valorada) {

			try {
				objConversor.connect();
				idPelis = objConversor.getAllValoracionCapituloFromId_c(id_c);
				objConversor.disconnect();
			} catch (ClassNotFoundException e) {
			}
		} else {
			FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
			f.setFalta("Este capitulo no ha sido valorada");
			throw f;
		}
		return idPelis;
	}
}
